package com.xh.rufongwallpaper.common.result;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.domain.Page;

import java.io.Serializable;
import java.util.List;

/**
 * 分页结果
 *
 * @author XH
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 当前页码
     */
    private int page;

    /**
     * 每页大小
     */
    private int size;

    /**
     * 总记录数
     */
    private long total;

    /**
     * 总页数
     */
    private int pages;

    /**
     * 分页数据
     */
    private List<T> list;

    /**
     * 从Spring Data Page创建分页结果
     *
     * @param page Spring Data分页对象
     * @param <T>  数据类型
     */
    public PageResult(Page<T> page) {
        this.page = page.getNumber();
        this.size = page.getSize();
        this.total = page.getTotalElements();
        this.pages = page.getTotalPages();
        this.list = page.getContent();
    }

    /**
     * 创建分页结果
     *
     * @param page  当前页码
     * @param size  每页大小
     * @param total 总记录数
     * @param list  分页数据
     * @param <T>   数据类型
     * @return 分页结果
     */
    public static <T> PageResult<T> of(int page, int size, long total, List<T> list) {
        return new PageResult<>(page, size, total, (int) Math.ceil((double) total / size), list);
    }

    /**
     * 从Spring Data Page创建分页结果
     *
     * @param page Spring Data分页对象
     * @param <T>  数据类型
     * @return 分页结果
     */
    public static <T> PageResult<T> of(Page<T> page) {
        return new PageResult<>(page);
    }

    /**
     * 是否有上一页
     *
     * @return 是否有上一页
     */
    public boolean hasPrevious() {
        return page > 0;
    }

    /**
     * 是否有下一页
     *
     * @return 是否有下一页
     */
    public boolean hasNext() {
        return page < pages - 1;
    }
} 